#!/bin/bash
# 
# 
SCRIPT_NAME='spam-check'
VERSION='0.3.5'
DESCRIPTION='SpamCheck - скрипт для проверки IP-адресов по спам базам'
AUTHOR='(C) 2010 Roman (Angel2S2) Shagrov'
EMAIL='angel2s2ru@gmail.com'
JABBER='angel2s2ru@jabber.org'
BLOG='http://angel2s2.blogspot.com/'
LICENSE='GPLv3'
#       This program is free software; you can redistribute it and/or modify
#       it under the terms of the GNU General Public License as published by
#       the Free Software Foundation; either version 2 of the License, or
#       (at your option) any later version.
#       
#       This program is distributed in the hope that it will be useful,
#       but WITHOUT ANY WARRANTY; without even the implied warranty of
#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#       GNU General Public License for more details.
#       
#       You should have received a copy of the GNU General Public License
#       along with this program; if not, write to the Free Software
#       Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
#       MA 02110-1301, USA.
#
# 
# Обо всех ошибках, замечаниях и предложениях пишите на angel2s2ru@gmail.com 
# или оставляйте комментарии в моем блоге http://angel2s2.blogspot.com/
# 

SED='/bin/sed'
DATE='/bin/date'
PING='/bin/ping -c 1 '
TOUCH='/bin/touch'
WGET='/usr/bin/wget'
HOST='/usr/bin/host'
SORT='/usr/bin/sort'
UNIQ='/usr/bin/uniq'
ICONV='/usr/bin/iconv -f UTF-8 '
LOGGER='/usr/bin/logger'

# Имя машины, используется только для лог-файла
HOSTNAME=$($SED "1q" /proc/sys/kernel/hostname) #uname -n

# "Вшитый" список DNSBL для проверки
#  0 - по-умолчанию
#  1 - дурнославящиеся
#  2 - не доступны из некоторых мест
LISTS[0]='abuse.rfc-ignorant.org access.redhawk.org aspews.ext.sorbs.net b.barracudacentral.org blackholes.brainerd.net blackholes.five-ten-sg.com blackholes.wirehub.net blacklist.junkemailfilter.com blacklist.sci.kun.nl blacklist.woody.ch bl.deadbeef.com bl.emailbasura.org block.dnsbl.sorbs.net bl.redhatgate.com bl.spamcannibal.org bl.spamcop.net bl.technovision.dk c10.rbl.hk cbl.abuseat.org cbl.anti-spam.org.cn cblless.anti-spam.org.cn cblplus.anti-spam.org.cn combined.njabl.org db.wpbl.info dialups.mail-abuse.org dialups.visi.com dnsbl-0.uceprotect.net dnsbl-1.uceprotect.net dnsbl-2.uceprotect.net dnsbl-3.uceprotect.net dnsbl.ahbl.org dnsbl.cyberlogic.net dnsbl.jammconsulting.com dnsbl.kempt.net dnsbl.njabl.org dnsbl.sorbs.net duinv.aupads.org dul.dnsbl.sorbs.net dul.ru fl.chickenboner.biz hil.habeas.com hostkarma.junkemailfilter.com http.dnsbl.sorbs.net http.opm.blitzed.org images.rbl.msrbl.net ips.backscatterer.org ircbl.ahbl.org ix.dnsbl.manitu.net korea.services.net l2.bbfh.ext.sorbs.net list.dnswl.org mail-abuse.blacklist.jippg.org map.spam-rbl.com misc.dnsbl.sorbs.net msgid.bl.gweep.ca multi.surbl.org multi.uribl.com no-more-funn.moensted.dk ohps.dnsbl.net.au omrs.dnsbl.net.au orid.dnsbl.net.au orvedb.aupads.org osps.dnsbl.net.au osrs.dnsbl.net.au owfs.dnsbl.net.au owps.dnsbl.net.au pbl.spamhaus.org phishing.rbl.msrbl.net probes.dnsbl.net.au proxy.bl.gweep.ca psbl.surriel.com query.bondedsender.org rbl.cluecentral.net rbl-plus.mail-abuse.org rbl.snark.net rdts.dnsbl.net.au relays.bl.gweep.ca relays.bl.kundenserver.de relays.mail-abuse.org relays.nether.net ricn.dnsbl.net.au rmst.dnsbl.net.au rot.blackhole.cantv.net rsbl.aupads.org satos.rbl.cluecentral.net sbl.csma.biz sbl.spamhaus.org sbl-xbl.spamhaus.org smtp.dnsbl.sorbs.net socks.dnsbl.sorbs.net socks.opm.blitzed.org sorbs.dnsbl.net.au spam.dnsbl.sorbs.net spamguard.leadmon.net spam.olsentech.net spamrbl.imp.ch spamsites.dnsbl.net.au spamsources.dnsbl.info spamsources.fabel.dk spam.wytnij.to t1.bl.dnsbl.net.au t1.dnsbl.net.au ubl.unsubscore.com ucepn.dnsbl.net.au virbl.bit.nl virbl.dnsbl.bit.nl virus.rbl.jp virus.rbl.msrbl.net web.dnsbl.sorbs.net whois.rfc-ignorant.org wingate.opm.blitzed.org wormrbl.imp.ch wpbl.dnsbl.net.au xbl.spamhaus.org zen.spamhaus.org zombie.dnsbl.sorbs.net rhsbl.sorbs.net'
LISTS[1]=''
LISTS[2]=''
DNSBL_LIST=( $(echo ${LISTS[0]}) )

# Установка параметров по-умолчанию
IS_QUIET=0					# -q		- Ничего не выводить
IS_DNSBL_PRINT=0				# -l		- Вывести список dnsbl-серверов
IS_ONE_DNSBL=0					# -d <dnsbl>	- Указатель, что надо проверить по указанному DNSBL
IS_FILE=0					# -f [+]<file>	- Указатель, что используется файл
IS_INET=0					# -i		- Сграбить список DNSBL с сайта http://myiptest.com/
IS_TIME_OUT_ERROR=1				# -t		- Считать тайм ауты подключения к DNSBL ошибками и выводить в поток ошибок?
IS_MY_DNS=0					# Флаг, устанавливается, если указан -s
DNS_SERVER='208.67.222.222'			# -s <dns>	- DNS Server (OpenDNS.com), через который будет проверяться IP по DNSBL
SHOW_IP_ONLY=0					# -p		- Только показать все IP'шники, которые будут проверены
USE_LOG=0					# --log [file]  - вести лог в файл, 
						#+ либо если файл не указан, проверить системные настройки ведения лога на наличие строк содержащих $LOG_TAG 
						#+ и использовать $LOGGER, иначе будет использован файл по умолчанию $LOG_FILE_DEFAULT
USE_SYSLOG=0					# --slog        - выводить в syslog, игнорируя системные настройки;
						#+ так же флаг устанавливается в случае если настроен вывод для $LOGGER (syslog, syslog-ng, rsyslog etc.)
DISABLE_THREADS=0				# --no-threads  - отключение потоковой обработки текущего IP


# Установка "непараметризованных" переменных по-умолчанию
RESOLVCONF='/etc/resolv.conf'
IP_LIST=( )					# Спосок IP-адресов 
MX_LIST=( )					# Список MX-записей (хранятся временно, для разрешения их в IP'шники)
IP_AND_FQDN_LIST=( )				# Для временного хранения ip'шников и fqsn'ов
DNSBL_FILE=''					# Имя файла установленного параметром -f
LOG_TAG="spamcheck"				# строка маркировки в логе
LOG_FILE=''					# имя файла для лога
LOG_FILE_DEFAULT="./$LOG_TAG.log"		#"$($DATE +spamcheck-%Y%m%d-%H%M%S.log)" # имя файла лога по умолчанию
SPACELINE=( '' '' '-------------------------' )	# массив строк для смещений вывода в главном цикле и ф-ии _get_and_parse_dnsbl_return


# Catch signals on terminate
_kill_threads() {
	rm -f $PIDSEND
	killall -9 $(echo "${0}" | sed "s/.*\///g;")
}
trap "_kill_threads" INT KILL TERM QUIT

_exit() {
	rm -f $PIDSEND
	exit $1
}

_output() {
# name		Конвертирует строку в текущую локаль из UTF-8 и выводит строку на стандартный поток либо поток ошибок
# $1		Строка, которую надо вывести (надо заключать в кавычки, если есть пробельные символы)
# $2		Куда выводить (stdout (1)  или stderr (2))
# output	Возвращает указанную строку ($1) выводя ее на stdout или stderr
# return	0

	# Если обычный режим, то выводим инфу на консоль, иначе просто все игнорируем
	# Вывод в любом случае будет перекодирован 
	local MSG="$(echo "$2" | $ICONV)"
	if [ $IS_QUIET -eq 0 ] ; then
		if [ $1 -eq 2 ] ; then
			echo "${MSG}" 1>&2
		else
			echo "${MSG}"
		fi
	fi
	if [ $USE_SYSLOG -eq 1 ] ; then
		$LOGGER -t "$LOG_TAG" -- "${MSG}"
	elif [ "$USE_LOG" -eq 1 ] ; then
		# можно добавить [$$] к $LOG_TAG, но pid будет постоянно разным
		$DATE +"%b %m %T $HOSTNAME $LOG_TAG: ${MSG}" >> "$LOG_FILE"
	fi
}

_version() {
# name		Версия, копирайт, лицензия, контакты
# output	--//--
# return	0 
	_output 1 "$SCRIPT_NAME, version $VERSION"
	_output 1 "Copyright $AUTHOR"
	_output 1 "License $LICENSE"
	_output 1 "Contacts: $EMAIL | $JABBER | $BLOG"
}

_usage() {
# name		"Правила" использования скрипта
# output	--//--
# return	0
	_output 1 "usage:  $SCRIPT_NAME [-q] [-l] [-d dnsbl | -f <file> | -i] [-I] [-f +<file>] [-s dns_server] [-t] [--log [file]|--slog] [--no-threads] [--] [ip or domain-name ...]"
}

_help() {
# name		Справка по использованию параметров скрипта
# output	--//--
# return	0
	_usage
	_output 1 ""
	_output 1 "   -q				- Ничего не выводить"
	_output 1 "   -l				- Показать список DNSBL-серверов"
	_output 1 "   -p				- Показать список IP, которые должны быть проверены"
	_output 1 "   -d dnsbl			- Проверить по указанному dnsbl"
	_output 1 "   -f file			- Взять список DNSBL-серверов из файла file"
	_output 1 "   -f +file			- Тоже что и -f, но в добавление к текущему списку DNSBL"
	_output 1 "   -i				- Сграбить список DNSBL с сайта http://myiptest.com/"
	_output 1 "   -I				- Тоже что и -i, но в добавление к текущему списку DNSBL"
	_output 1 "   -s dns			- Указать DNS-сервер, через который будет идти проверка"
	_output 1 "   -t				- Считать Time Out'ы ошибкой"
	_output 1 "   --log [file]			- Вести отчет в file. Если file не указан, будет использован файл по умолчанию $LOG_FILE_DEFAULT"
	_output 1 "     				  Подробнее на http://code.google.com/p/spamcheck/wiki/log"
	_output 1 "   --slog			- Игнорировать программные настройки и вести системное логгирование"
	_output 1 "   --no-threads  		- отключение потоковой обработки текущего IP"
	_output 1 "   --				- Считается, что дальше идут только ip и/или доменные имена"
	_output 1 "   [ip or domain-name ...]	- ip и/или доменные имена, которые нужно проверить"
	_output 1 "   --version, --help, --usage	- без комментариев"
}

_bad_param() {
# name		Сообщение о не известном/не верном параметре переданном скрипту	
# output	--//--
# return	0
	_output 2 "Не известный параметр: $1"
}

_bad_params_combine() {
# name		Выводит сообщение "Не совместимые параметры!"
# output	--//--
# return	0
	_output 2 "Не совместимые параметры!"
	_exit 1
}

_reverse_ip() {
# name		"Переворачивает" переданный ip-адрес и возвращает его
# $1		ip-адрес
# output	"Перевернутый" ip-адрес
# return	0
	echo $1 | $SED -e 's/$/\n/;:z;s/\([0-9]\{1,3\}\)\([^\n]*\n\)/\2\1./;tz;s/.*\n//;s/.$//'
}

_build_ip_list() {
# name		Все что передано, добавляет в $IP_AND_FQDN_LIST
# $1		ip-адрес
# output	none
# return	0
	IP_AND_FQDN_LIST[${#IP_AND_FQDN_LIST[@]}]="$*"
}

___check_and_build_ip_list() {
	local HOST_RESULT
	# Заносим результат в переменную, для экономии трафика и повышения скорости работы скрипта
	HOST_RESULT=$($HOST $1 $DNS_SERVER)
	# Все полученные ip'шники кладем сюда...
	IP_LIST=( ${IP_LIST[@]} $(echo "$HOST_RESULT" | $SED -n '/address/s/.\+address\ \([0-9\.]\+\)/\1/gp') )
	# ...а сюда MX записи (или алиасы)
	MX_LIST=( $(echo "$HOST_RESULT" | $SED -n '/handled/s/.\+\ [0-9]\+\ \(.\+\)\./\1/p') ${MX_LIST[@]} )
}

_check_ip_list() {
# name		Читает переменную $IP_AND_FQDN_LIST, преобразовывает FQDN'ы в ip-адреса и заносит результат в переменную $IP_LIST
# output	none
# return	0
	local IS_IP
	for IP in ${IP_AND_FQDN_LIST[@]} ; do
		IS_IP=$(echo $IP | $SED -n '/^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$/p')
		# если не пусто, значит у нас IP...
		if [ -n "$IS_IP" ] ; then 
			IP_LIST[${#IP_LIST[@]}]=$IP
		# ...иначе доменное имя
		else
			___check_and_build_ip_list $IP
		fi
	done
	# Вложенные циклы необходимы, чтобы получить IP'шники тех MX'ов, на запрос которых DNS возвращает другой MX
	# (очень редкий случай, но бывает)
	while [ ${#MX_LIST[@]} -gt 0 ]; do
		___check_and_build_ip_list "${MX_LIST[${#MX_LIST[@]}-1]}"
		unset MX_LIST[${#MX_LIST[@]}-1]
	done
}

_read_dnsbl() {
# name		Читает список DNSBL-серверов из файла и, если указано, объединяет со вшитой базой
# $1		Файл со списком DNSBL-серверов
# output	Список DNSBL-серверов или сообщение в случае ошибки
# return	0
	local RESULT

	if [ -r "$1" ] ; then
		echo "${DNSBL_LIST[@]} $($SED '/^[[:blank:]]*#\|^$/d' "$1")"
		return 0
	fi
	RESULT="Файл $1 не существует, либо нет прав на чтение!"
	[ "$IS_FILE" -eq "1" ] && echo "$RESULT" 			&& return 1
	# Если добавление к файлам, то уведомить и ничего не выводить, т.к. позже будет добавлен результат вывода
	[ "$IS_FILE" -eq "2" ] && _output 2 "УВЕДОМЛЕНИЕ: $RESULT!" 	&& return 0
}

_parse_thread() {
# name		Получает ответ от DNSBL сервера, парсит его и выводим соответствующую информацию
# $1		Перевернутый IP
# $2		DNSBL
# output	Сообщение о результате
# return	1 | 0   (Done | Error)
	local GPD
	local RES_A
	local RES_TXT
	local R_IP=$1
	local DNSBL=$2

	GPD=$($HOST -t A $IP.$DNSBL $DNS_SERVER)
	if [ $? -eq 1 ]; then
		if [ -z "$(echo "$GPD" | $SED -n '/connection timed out/p')" ]; then
			# Нас нет в DNSBL :)
			_output 1 "[ OK ]         - $DNSBL${SPACELINE[0]:${#DNSBL}}  - $(echo $GPD | $SED -n '/not found/s/^.*\(not\ found.\+$\)/\1/p')"
		else
			# Или может мы просто не можем достучаться до DNSBL-сервера?
			_output $IS_TIME_OUT_ERROR "[ ERROR ]      - $DNSBL${SPACELINE[0]:${#DNSBL}}  - connection time out"
			[ $IS_TIME_OUT_ERROR -eq 2 ] && return 1
		fi
		return 0
	fi

	# Черт... У нас проблемы :(
	RES_A=$(echo "$GPD" | $SED -n '/\ has\ address\ /s/^.*address\ \([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*$/\1/p')
	if [ -n "$RES_A" ] ; then
		# Узнаем подробности
		RES_TXT=$($HOST -t TXT $IP.$DNSBL $DNS_SERVER | $SED -n '/text/s/^.*\"\(.\+\)\".*$/\1/p')
		_output 2 "[ +++SPAM+++ ] - $DNSBL${SPACELINE[0]:${#DNSBL}}  - ($RES_A) $RES_TXT"
		return 1
	fi

	RES_A=$(echo "$GPD" | $SED -n '/\ has\ no\ A\ record/ip')
	if [ -n "$RES_A" ]; then
		_output 2 "[ INFO ]       - $DNSBL${SPACELINE[0]:${#DNSBL}}  - no A record"
		return 0
	fi

	_output 2 "Странно... Ты не должен был этого видеть... о_О Напиши мне багрепорт, плиз, укажи ${DNSBL}, версии sh, sed, host и самого скрипта, а так же какая у тебя ось и какие параметры были переданы скрипту. Заранее спасибо. Мое мыло: angel2s2ru@gmail.com"
	return 1
}

_log_set() {
# name		Установка ведения лога
# output	Сообщение в случае ошибки
# return	Флаг ошибки
	# проверка на наличие в системных настройках ведения лога строк содержащих $LOG_TAG
	if [ -z "$LOG_FILE" -a -n "$($SED -ne "/^[[:blank:]]*#/d;/$LOG_TAG/p" /etc/*syslog*.conf)" ] ; then
		[ -e "$LOGGER" ] && USE_SYSLOG=1;
		return 0;
	fi

	[ -z "$LOG_FILE" ] && LOG_FILE="$LOG_FILE_DEFAULT"
	if ! $TOUCH "$LOG_FILE" &> /dev/null ; then
		USE_LOG=0
		_output 2 "Ведение лога невозможно - нет прав на запись, либо каталог не существует"
		return 1
	fi
	return 0;
}

_printf_offset_fix() {
# name		Определение смещения для форматированного вывода
	for D in ${DNSBL_LIST[@]}; do
		if [ ${#D} -gt ${#SPACELINE[0]} ]; then
		  SPACELINE[0]="$(echo "${D}" | $SED -e 's/./ /g;')";
		  SPACELINE[1]="$(echo "${D}" | $SED -e 's/./-/g;')";
		fi
	done
}

# Парсим параметры запуска
if [ $# -eq 0 ] ; then _help ; _exit 1 ; fi
while [ $# -gt 0 ]; do
	case "$1" in
		"-q"	) IS_QUIET=1 ; shift ;;
		"-t"	) IS_TIME_OUT_ERROR=2 ; shift ;;
		"-f"	) IS_FILE=1 ; DNSBL_FILE="$2" ; shift 2 ;;
		"-i"	) IS_INET=1 ; shift ;;
		"-I"	) IS_INET=2 ; shift ;;
		"-d"	) IS_ONE_DNSBL=1 ; DNSBL_LIST=( "$2" ) ; shift 2 ;;
		"-l"	) IS_DNSBL_PRINT=1 ; shift ;;
		"-s"	) IS_MY_DNS=1 ; DNS_SERVER="$2" ; shift 2 ;;
		"-p"	) SHOW_IP_ONLY=1 ; shift ;;
		# При добавлении/изменении имен параметров обновите строку для $SED
		"--log" ) USE_LOG=1 ; shift ; [ -n "$(echo "$1" | $SED -e '/^-[qtfiIdlsp-]$/d;/^--\|--version\|--help\|--usage\|--slog\|--log\|--no-threads$/d')" ] && LOG_FILE="$1" && shift ;;
		"--slog") USE_SYSLOG=1 ; shift ;;
		"--no-threads") DISABLE_THREADS=1 ; shift ;;
		"--"	) shift ; _build_ip_list $* ; break ;;
		"--version"	) _version ; _exit 255 ;;
		"--help"	) _help ; _exit 255 ;;
		"--usage"	) _usage ; _exit 255 ;;
		-*		) _bad_param $1 ; _exit 1 ;;
		*		) _build_ip_list $1 ; shift ;;
	esac
done
if [ "$IS_FILE" -ne "0" ]; then
	# Определяем тут же, является ли $DNSBL_FILE добавлением к существующему blacklist`у
	if [ "+" == "${DNSBL_FILE:0:1}" ]; then
		IS_FILE=2
		DNSBL_FILE="${DNSBL_FILE/+}"
	fi
	if [ -z "$DNSBL_FILE" ]; then
		_output 2 "Имя файла не указано. Если имя файла \"+\", укажите его как ./+"
		_exit 1;
	fi
fi

# Обрабатываем параметр --log первым, дабы зафиксировать все
if [ "$USE_SYSLOG" -eq 0 -a "$USE_LOG" -eq 1 ] ; then
	_log_set || _exit 1;
fi

# Проверка на (не)совместимость параметров
[ "$IS_DNSBL_PRINT" -eq "1" -a "$IS_QUIET" -eq "1" ] && _bad_params_combine
[ "$IS_FILE" -eq "1" -a "$IS_INET" -eq "1" ] && _bad_params_combine;
[ "$IS_FILE" -eq "1" -o "$IS_FILE" -eq "2" ] && [ "$IS_ONE_DNSBL" -eq "1" ] && _bad_params_combine;
[ "$IS_INET" -eq "1" -o "$IS_INET" -eq "2" ] && [ "$IS_ONE_DNSBL" -eq "1" ] && _bad_params_combine;

# Обработка параметров для заполнения $DNSBL_LIST 
if [ "$IS_ONE_DNSBL" -ne "1" ]; then
	if [ "$IS_FILE" -eq "1" -o "$IS_FILE" -eq "2" ]; then 
		DNSBL_LIST_RES="$(_read_dnsbl "$DNSBL_FILE")"
		if [ "$?" -eq "1" ]; then
			_output 2 "${DNSBL_LIST_RES}"
			_exit 1;
		fi
	fi
	[ "$IS_FILE" -eq "1" ] && DNSBL_LIST=( ${DNSBL_LIST_RES} )
	[ "$IS_INET" -eq "1" ] && DNSBL_LIST=( $($WGET -q -O - 'http://www.myiptest.com/staticpages/index.php/check-Blacklisted-IP-DNSBL/'$DNS_SERVER | \
							$SED -n '/href=.\+dnsbl=/s/^.\+dnsbl=\([a-zA-Z0-9\.\-]\+\).*$/\1/gp') )

	[ "$IS_FILE" -eq "2" ] && DNSBL_LIST=( ${DNSBL_LIST[@]} ${DNSBL_LIST_RES} )
	[ "$IS_INET" -eq "2" ] && DNSBL_LIST=( ${DNSBL_LIST[@]} $($WGET -q -O - 'http://www.myiptest.com/staticpages/index.php/check-Blacklisted-IP-DNSBL/'$DNS_SERVER | \
								$SED -n '/href=.\+dnsbl=/s/^.\+dnsbl=\([a-zA-Z0-9\.\-]\+\).*$/\1/gp') )
fi
DNSBL_LIST=( $(echo "${DNSBL_LIST[@]}" | $SED -e 's/[[:blank:]]\+/\n/g;' | $SORT | $UNIQ) )
# эмуляция uniq, но без сортировки
#DNSBL_LIST="$(echo $DNSBL_LIST | $SED -e ':a; s/\(^[^ ]\+\.[^ .]\+\) \(.\+\) \1/\2 \1/; ta;')"

# Список DNSBL-серверов заполнен?
if [ "${#DNSBL_LIST[@]}" -eq "0" -a $IS_INET -eq 1 ] ; then _output 2 'Список DNSBL-серверов пуст! Возможно не удалось подкючиться к северу.' ; _exit 1 ; fi
if [ "${#DNSBL_LIST[@]}" -eq "0" -a $IS_FILE -eq 1 ] ; then _output 2 'Список DNSBL-серверов пуст! Фозможно файл пустой.' ; _exit 1 ; fi
if [ "${#DNSBL_LIST[@]}" -eq "0" ] ; then _output 2 'Список DNSBL-серверов пуст! Ты случаем в скрипте переменную $DNSBL_LIST не удалил?' ; _exit 1 ; fi


# Вывод списка DNSBL серверов, если на то был "запрос"
if [ $IS_DNSBL_PRINT -gt 0 ] ; then echo "${DNSBL_LIST[@]}" | $SED -e "s/[[:blank:]]\+/\n/g"; _exit 0 ; fi


# Если юзер не указал свой dns-сервер и
#+ если есть в системе resolv.conf...
if [ $IS_MY_DNS -eq 0 -a -r $RESOLVCONF ] ; then 
	# ...выдираем из него IP'шники DNS-серверов...
	NS=$($SED -n '/nameserver/s/.*[[:blank:]]\+\([0-9\.]\+\)/\1/p' $RESOLVCONF)
	# ...и проверяем их на доступность...
	for NS_CURRENT in $NS ; do
		# ...если хоть один доступен...
		$PING $NS_CURRENT >/dev/null 2>&1
		if [ $? -eq 0 ] ; then
			# ...то будем юзать его
			DNS_SERVER=$NS_CURRENT
			break
		fi
	done
fi	# В противном случае будет использоваться DNS-сервер по дефолту (см. переменную $DNS_SERVER в разделе "Параметры по умолчанию")

_check_ip_list

# Только показать все IP'шники, которые будут проверены
if [ $SHOW_IP_ONLY -eq 1 ] ; then
	echo "${IP_LIST[@]}" | $SED -e "s/[[:blank:]]\+/\n/g"
	_exit 0
fi

# IP указан?
if [ "${#IP_LIST[@]}" -eq "0" ] ; then _output 2 "Не указаны адреса для проверки!" ; _exit 1 ; fi

_printf_offset_fix ;

PIDSEND=$(mktemp -q)
echo 0 > $PIDSEND
for IP in ${IP_LIST[@]} ; do
	# Получаем "перевернутый" IP
	R_IP=$(_reverse_ip $IP)
	_output 1 "----------------${SPACELINE[1]} ${IP} ${SPACELINE[2]:${#IP}}"
	# Проверяем наши IP по спам-базам и выводим результат на консоль
        for DNSBL in ${DNSBL_LIST[@]} ; do
		( _parse_thread "$R_IP" "$DNSBL" || echo 1 > $PIDSEND ) &
		[ $DISABLE_THREADS -eq 1 ] && wait
        done
	wait
done
_exit $($SED '' $PIDSEND)

